#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <functional>
#include <vector>

// 进程调度函数
void Sched()
{
    std::cout << "我是进程调度" << std::endl;
}

// 内存管理函数，周期性检查内存问题
void MemManger()
{
    std::cout << "我是周期性的内存管理，正在检查有没有内存问题" << std::endl;
}

// 刷新函数，定期将内存数据刷新到磁盘
void Fflush()
{
    std::cout << "我是刷新程序，我在定期刷新内存数据，到磁盘" << std::endl;
}

// 使用std::function定义函数指针类型
using func_t = std::function<void()>;
// 存储函数指针的向量
std::vector<func_t> funcs;

// 信号处理函数，当接收到信号时执行向量中的所有函数
void handlerSig(int sig)
{
    std::cout << "收到信号" << sig << std::endl;
    std::cout << "##############################" << std::endl;
    for (auto f : funcs)
        f();
    std::cout << "##############################" << std::endl;
    int n = alarm(1);
}

// 主函数，设置信号处理和定时器，循环等待信号
int main()
{
    // 将调度函数添加到函数列表中
    funcs.push_back(Sched);
    // 将内存管理函数添加到函数列表中
    funcs.push_back(MemManger);
    // 将文件刷新函数添加到函数列表中
    funcs.push_back(Fflush);

    // 设置信号处理函数，当接收到SIGALRM信号时调用handlerSig函数
    signal(SIGALRM, handlerSig);
    // 设置1秒后第一次触发SIGALRM信号
    alarm(1);      

    // 业务逻辑
    // 无限循环，等待信号的到来
    while (true)
    {
        pause();
    }
    
    return 0;
}